package zuoye7_1;

import java.util.Scanner;

import demo13.threadPooldemo;

//6.
//现有函数 printNumber 可以用一个整数参数调用，并输出该整数到控制台。
//例如，调用 printNumber(7) 将会输出 7 到控制台。
//给你类 ZeroEvenOdd 的一个实例，该类中有三个函数：zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程：
//线程 A：调用 zero() ，只输出 0
//线程 B：调用 even() ，只输出偶数
//线程 C：调用 odd() ，只输出奇数
//修改给出的类，以输出序列 "010203040506..." ，其中序列的长度必须为 2n 。
//实现 ZeroEvenOdd 类：
//ZeroEvenOdd(int n) 用数字 n 初始化对象，表示需要输出的数。
//void zero(printNumber) 调用 printNumber 以输出一个 0 。
//void even(printNumber) 调用printNumber 以输出偶数。
//void odd(printNumber) 调用 printNumber 以输出奇数。
// 
//
//示例 1：
//
//输入：n = 2
//输出："0102"
//解释：三条线程异步执行，其中一个调用 zero()，另一个线程调用 even()，最后一个线程调用odd()。正确的输出为 "0102"。
//示例 2：
//输入：n = 5
//输出："0102030405"


public class ZuoYe8_Demo {
    public static void main(String[] args) {
    	System.out.println("输入数字n:");
		Scanner sc =new Scanner(System.in);
		int n =  sc.nextInt();	
        ZeroEvenOdd zeo = new ZeroEvenOdd(n);
        
        Thread zero = new Thread(() -> {
            try {
                zeo.zero();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread even = new Thread(() -> {
            try {
                zeo.even();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread odd = new Thread(() -> {
            try {
                zeo.odd();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        zero.start();
        even.start();
        odd.start();
        try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        zero.stop();
        even.stop();
        odd.stop();
    }
}

class ZeroEvenOdd {
    private int n;
    private int i = 1;
    private boolean zeroTurn = true;
    
    public ZeroEvenOdd(int n) {
        this.n = n;
    }

    public synchronized void zero() throws InterruptedException {
        while (i <= n) {
            if (zeroTurn) {
                System.out.print(0);
                zeroTurn = false;
                notifyAll();
                wait();
            } 
        }
        
    }

    public synchronized void even() throws InterruptedException {
        while (i <= n) {
            if (!zeroTurn && i % 2 == 0) {
                System.out.print(i);
                i++;
                zeroTurn = true;
                notifyAll();
                wait();
            } else {
                wait();
            }
        }
    }

    public synchronized void odd() throws InterruptedException {
        while (i <= n) {
            if (!zeroTurn && i % 2 != 0) {
                System.out.print(i);
                i++;
                zeroTurn = true;
                notifyAll();
                wait();
            } else {
                wait();
            }
        }
    }
}
      
